Switchlayer

根据索引从输入张量数组中选择一个张量,并将其数据复制到输出。该算子不区分数据类型,适用于所有数据类型。

\[\text{output} = \text{input\_tensors}[\text{index}]\]

该算子会将选中的输入张量的数据复制到输出张量中。复制的大小为 size * type_size 字节。

输入:
  • input_tensors - 输入张量数组(TensorC** 类型),包含多个待选择的张量。

  • index - 选择的索引(int 类型),指定从 input_tensors 数组中选择哪个张量。

  • core_mask - 核掩码(int),仅共享存储版本需要。

输出:
  • output - 输出张量(TensorC* 类型),包含复制后的数据。输出张量的 sizetype_size 应与选中的输入张量相同。

TensorC 结构体定义:
  • type_size - 数据类型大小(long long),单位字节,例如 float32 为 4,float16 为 2。

  • size - 元素个数(long long)。

  • data - 数据指针(void*)。

支持平台:

FT78NE MT7004

备注

  • 该算子不区分数据类型,适用于所有数据类型

  • 算子会复制数据,输出张量与输入张量数据独立

  • 调用前需要确保 output->data 指向的内存空间足够大(至少 size * type_size 字节)

  • 选中的输入张量的 sizetype_size 应与输出张量匹配

共享存储版本:

void switchlayer_s(TensorC **input_tensors, TensorC *output, int index, int core_mask)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <switchlayer.h>
 4
 5int main(int argc, char* argv[]) {
 6    // 假设在DDR空间
 7    TensorC input0, input1, input2;
 8    TensorC output;
 9
10    // 初始化 input0
11    input0.type_size = 4;  // float32
12    input0.size = 1000;
13    input0.data = (void *)0xA0000000;
14
15    // 初始化 input1
16    input1.type_size = 4;  // float32
17    input1.size = 1000;
18    input1.data = (void *)0xA1000000;
19
20    // 初始化 input2
21    input2.type_size = 4;  // float32
22    input2.size = 1000;
23    input2.data = (void *)0xA2000000;
24
25    // 初始化 output
26    output.type_size = 4;  // float32
27    output.size = 1000;
28    output.data = (void *)0xB0000000;  // 需要预先分配足够的内存
29
30    // 创建输入张量数组
31    TensorC* input_tensors[3] = {&input0, &input1, &input2};
32
33    int index = 1;  // 选择 input1
34    int core_mask = 0xff;
35
36    switchlayer_s(input_tensors, &output, index, core_mask);
37
38    // 此时 output.data 包含 input1.data 的副本
39
40    return 0;
41}

私有存储版本:

void switchlayer_p(TensorC **input_tensors, TensorC *output, int index)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <switchlayer.h>
 4
 5int main(int argc, char* argv[]) {
 6    // 假设在L2空间
 7    TensorC input0, input1, input2;
 8    TensorC output;
 9
10    input0.type_size = 4;  // float32
11    input0.size = 1000;
12    input0.data = (void *)0x10000000;
13
14    input1.type_size = 4;
15    input1.size = 1000;
16    input1.data = (void *)0x10001000;
17
18    input2.type_size = 4;
19    input2.size = 1000;
20    input2.data = (void *)0x10002000;
21
22    output.type_size = 4;
23    output.size = 1000;
24    output.data = (void *)0x10003000;  // 需要预先分配足够的内存
25
26    TensorC* input_tensors[3] = {&input0, &input1, &input2};
27
28    int index = 0;  // 选择 input0
29
30    switchlayer_p(input_tensors, &output, index);
31
32    return 0;
33}